package innerclass;

/**
 * @author wly
 * @create 2022-12-08 22:51
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.method();
    }
}

class Outer02{
    //基于接口的匿名内部类
    //1.需求： 想使用IA接口,并创建对象
    //2.传统方式，是写一个类，实现该接口，并创建对象
    //3.老韩需求是 Tiger/Dog 类只是使用一次，后面再不使用
    //4. 可以使用匿名内部类来简化开发
    //5. tiger的编译类型 ? IA
    //6. tiger的运行类型 ? 就是匿名内部类  Outer04$1
        /*
            底层 会分配 类名 Outer04$1
            class Outer04$1 implements IA {
                @Override
                public void cry() {
                    System.out.println("老虎叫唤...");
                }
            }
         */
    //7. jdk底层在创建匿名内部类 Outer04$1,马上就创建了 Outer04$1实例，并且把地址
    //   返回给 tiger
    //8. 匿名内部类使用一次，就不能再使用
    public void method(){
        IA tiger = new IA(){

            @Override
            public void fun() {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型 = " + tiger.getClass());

        //基于类的匿名内部类
        //分析
        //1. father编译类型 Father
        //2. father运行类型 Outer04$2
        //3. 底层会创建匿名内部类
        /*
            class Outer04$2 extends Father{
                @Override
                public void test() {
                    System.out.println("匿名内部类重写了test方法");
                }
            }
         */
        //4. 同时也直接返回了 匿名内部类 Outer04$2的对象
        //5. 注意("jack") 参数列表会传递给 构造器
        Father father = new Father("tom"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写test方法");
            }
        };
        System.out.println("father 对象的运行类型= " + father.getClass());
//        father.test();

        //基于抽象类的匿名内部类
        Animal animal = new Animal() {

            @Override
            void eat() {
                System.out.println("小狗吃骨头...");
            }
        };
        System.out.println("animal对象的运行类型=" + animal.getClass());
        animal.eat();
    }

}

interface IA{
    void fun();
}

class Father{
    public Father(String name){
        System.out.println("接收到的name=" + name);
    }
    public void test(){}
}

abstract class Animal{
    abstract void eat();
}
